<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 函数柯里化
        // 1. 什么是柯里化
        // 1.1 柯里化（Currying）是把接受多个参数的函数变换成接受一个单一参数（最初函数的第一个参数）的函数，并且返回接受余下的参数且返回结果的新函数的技术。
        // 1.2 柯里化是一种“预加载”函数的能力，通过传递较少的参数，得到一个已经记住了这些参数的新函数，某种意义上讲，这是一种对参数的“缓存”，是一种非常高效的编写函数的方法。
        // 1.3 柯里化函数通常由以下步骤组成：
        // 1.1 创建一个函数，该函数将接受一个或多个参数
        // 1.2 创建一个内部函数，该内部函数将接受剩余的参数
        // 1.3 内部函数将使用所有接收到的参数执行某些操作
        // 1.4 返回内部函数
        // 1.5 例子：
        // function add(x, y, z) {
        //     return x + y + z;
        // }
        // function curry(fn) {
        //     return function (a) {
        //         return function (b) {
        //             return function (c) {
        //                 return fn(a, b, c);
        // }
        // }
        // }
        // }
        // const curriedAdd = curry(add);
        // console.log(curriedAdd(1)(2)(3)); // 6
        // 1.6 优点
        // 1.6.1 提高函数的复用性
        // 1.6.2 提高函数的模块化
        // 1.6.3 提高函数的可读性
        // 1.6.4 提高函数的灵活性
        // 1.6.5 提高函数的扩展性
        // 1.6.6 提高函数的维护性
        // 1.6.7 提高函数的稳定性
        // 1.6.8 提高函数的兼容性
        // 1.6.9 提高函数的效率
        // 1.6.10 提高函数的可靠性
        // 1.6.11 提高函数的健壮性
        // 2. 作用
        // 2.1 柯里化函数的主要作用是将一个多参数的函数转换为一个单参数的函数，从而提高函数的复用性、模块化、可读性、灵活性、扩展性、维护性、稳定性、兼容性、效率、可靠性、健壮性等。
        // 3. 实现
        function curry(fn) {
            let judge = (...args) => {
                if (args.length === fn.length) return fn(...args)
                return (...arg)=> judge(...args, ...arg)
            }
            return judge
        }
        function add(x, y, z) {
            return x + y + z;
        }
        const curriedAdd = curry(add);
        console.log(curriedAdd(1)(2)(3)); // 6
    </script>
</body>
</html>